#coding: utf-8
#-------------------------------------------------------------------------------
# Name:        InterfacePygame
# Purpose:     Possui janelas desenhadas em PyGame, cada qual com seu controle de eventos
#
# Author:      Johann
#
# Created:     13/11/2010
# Copyright:   (c) Johann 2010
# Licence:     <your licence>
#-------------------------------------------------------------------------------
#!/usr/bin/env python

import pygame as pg
from pygame.locals import *
from sys import exit

from urllib import urlopen
from datetime import date, datetime

from Transito import Transito
from Tempo import Tempo

class InterfacePygame:
    """Possui janelas desenhadas em PyGame, cada qual com seu controle de eventos"""

    def __init__(self):
        self.entrouwhile = False

    def capturarHora(self):
        """Captura hora atual via datetime.now()"""

        return str(datetime.now()).split(" ")[1][:5]

    def capturarData(self):
        """Captura data atual via datetime.now()"""

        dia = str(datetime.now()).split(" ")[0].split("-")[2]
        mes = str(datetime.now()).split(" ")[0].split("-")[1]
        ano = str(datetime.now()).split(" ")[0].split("-")[0]

        oldDate = date(int(ano), int(mes), int(dia))  # year, month, day que no caso são ano, mês, dia

        diasdasemana = ["Segunda", u"Terça", "Quarta", "Quinta", "Sexta", u"Sábado", "Domingo"]
        diasemana = diasdasemana[date.weekday(oldDate)]

        if mes == "01" or mes == "1": mes = "Janeiro"
        elif mes == "02" or mes == "2": mes = "Fevereiro"
        elif mes == "03" or mes == "3": mes = u"Março"
        elif mes == "04" or mes == "4": mes = "Abril"
        elif mes == "05" or mes == "5": mes = "Maio"
        elif mes == "06" or mes == "6": mes = "Junho"
        elif mes == "07" or mes == "7": mes = "Julho"
        elif mes == "08" or mes == "8": mes = "Agosto"
        elif mes == "09" or mes == "9": mes = "Setembro"
        elif mes == "10": mes = "Outubro"
        elif mes == "11": mes = "Novembro"
        elif mes == "12": mes = "Dezembro"

        return dia, mes, ano, diasemana

    def capturarSaudacao(self):
        """Captura saudação compatível com a hora atual, pode ser bom dia, boa tarde ou boa noite"""

        if int(self.capturarHora()[:2]) >= 0 and int(self.capturarHora()[:2]) < 13:
            return "Bom dia"
        elif int(self.capturarHora()[:2]) >= 13 and int(self.capturarHora()[:2]) < 18:
            return "Boa tarde"
        else:
            return "Boa noite"

    def janelaContas(self, listacontas):

        pg.init()

        if int(self.capturarHora()[:2]) >= 5 and int(self.capturarHora()[:2]) < 13:
            corfonte = (0, 0, 0)
            fundo = "interface\\fundos\\manha.png"
        elif int(self.capturarHora()[:2]) >= 13 and int(self.capturarHora()[:2]) < 18:
            corfonte = (0, 0, 0)
            fundo = "interface\\fundos\\tarde.png"
        else:
            corfonte = (255, 255, 255)
            fundo = "interface\\fundos\\noite.png"

        operconta = "interface\\botoes\\operconta.png"
        sobre = "interface\\botoes\\sobre.png"
        desligar = "interface\\botoes\\desligar.png"

        try:
            conta1 = listacontas[0].getUsuario()
            icone1 = "interface\\botoes\\contaativa.png"
        except:
            conta1 = "vazio"
            icone1 = "interface\\botoes\\containativa.png"

        try:
            conta2 = listacontas[1].getUsuario()
            icone2 = "interface\\botoes\\contaativa.png"
        except:
            conta2 = "vazio"
            icone2 = "interface\\botoes\\containativa.png"

        try:
            conta3 = listacontas[2].getUsuario()
            icone3 = "interface\\botoes\\contaativa.png"
        except:
            conta3 = "vazio"
            icone3 = "interface\\botoes\\containativa.png"

        black = (255,255,255)
        self.screen = pg.display.set_mode((415, 640))
        pg.display.set_caption('PyMemo')

        font = pg.font.SysFont("arial", 30)

        while True:
            pg.event.pump()
            keyinput = pg.key.get_pressed()
            pos = (20, 20)
            self.screen.fill(black)

            # blit do fundo
            self.screen.blit(pg.image.load(fundo).convert(), pg.image.load(fundo).convert().get_rect())

            # blit dos ícones das contas
            self.screen.blit(pg.image.load(icone1).convert(), pg.draw.circle(self.screen, (0,0,0), (30, 160), 10))
            self.screen.blit(pg.image.load(icone2).convert(), pg.draw.circle(self.screen, (0,0,0), (30, 280), 10))
            self.screen.blit(pg.image.load(icone3).convert(), pg.draw.circle(self.screen, (0,0,0), (30, 400), 10))

            # blit dos nomes de usuário das contas
            self.screen.blit(font.render(conta1, True, corfonte), (140, 160))
            self.screen.blit(font.render(conta2, True, corfonte), (140, 280))
            self.screen.blit(font.render(conta3, True, corfonte), (140, 400))

            # blit dos ícones
            self.screen.blit(pg.image.load(operconta).convert(), pg.draw.circle(self.screen, (0,0,0), (30, 610), 10))
            self.screen.blit(pg.image.load(sobre).convert(), pg.draw.circle(self.screen, (0,0,0), (165, 610), 10))
            self.screen.blit(pg.image.load(desligar).convert(), pg.draw.circle(self.screen, (0,0,0), (360, 585), 10))

            # usa um for aqui para vários screen.blit quando tiver vários usuários (recebe uma lista de usuário e vai iterando)
            self.screen.blit(font.render("Selecione sua conta...", True, corfonte), (90, 50))

            for event in pg.event.get():
                if event.type == QUIT:
                    exit()

                if event.type == MOUSEBUTTONDOWN:
                    x, y = pg.mouse.get_pos()

                    # 20 + 10 = 30, 600 + 10 = 620, logo a tupla de posição da imagem era (30, 610) acima
                    if (x in range(20, 400)) and (y in range(150, 230)):
                        print "\n\n** " + conta1 + " **\n\n"
                        self.screen.blit(font.render(u"Carregando informações...", True, corfonte), (50, 515))
                        pg.display.flip()
                        try:
                            return listacontas[0]
                        except:
                            print "\n\n** Conta inexistente **\n\n"

                    elif (x in range(20, 400)) and (y in range(270, 355)):
                        print "\n\n** " + conta2 + " **\n\n"
                        self.screen.blit(font.render(u"Carregando informações...", True, corfonte), (50, 515))
                        pg.display.flip()
                        try:
                            return listacontas[1]
                        except:
                            print "\n\n** Conta inexistente **\n\n"

                    elif (x in range(20, 400)) and (y in range(390, 475)):
                        print "\n\n** " + conta1 + " **\n\n"
                        self.screen.blit(font.render(u"Carregando informações...", True, corfonte), (50, 515))
                        pg.display.flip()
                        try:
                            return listacontas[2]
                        except:
                            print "\n\n** Conta inexistente **\n\n"

                    elif (x in range(20, 40)) and (y in range(600, 630)):
                        print "\n\n** Adicionar conta **\n\n"
                        return "adicionarconta"

                    elif (x in range(41, 60)) and (y in range(600, 630)):
                        print "\n\n** Editar conta **\n\n"
                        return "editarconta"

                    elif (x in range(61, 80)) and (y in range(600, 630)):
                        print "\n\n** Excluir conta **\n\n"
                        return "excluirconta"

                    elif (x in range(155, 255)) and (y in range(600, 630)):
                        print "\n\n** Sobre **\n\n"
                        return "sobre"

                    elif (x in range(350, 400)) and (y in range(570, 630)):
                        print "\n\n** Desligar **\n\n"
                        exit()


                elif event.type == MOUSEMOTION:
                    x, y = pg.mouse.get_pos()

                    print x, y

            #update em toda a tela, semelhante ao display.update (display.update
            #nem sempre dá update em toda a tela)
            pg.display.flip()

    def atualizarTemperatura(self, conta):
        """Atualiza a temperatura exibida"""

        pais = Tempo().localizarPais(conta.getCidade())
        temperaturatempo = Tempo().atualizarTemperatura(pais, conta.getCidade())

        temperatura = temperaturatempo[0]
        tempo = temperaturatempo[1]

        return pais, temperatura, tempo


    def janelaLembretes(self, conta):

        transito = Transito()

##        pais = "Brasil"
##
##        temperatura = "28"
##        tempo = "Mostly cloudy"

        pg.init()

        # pela hora do dia, seleciona o fundo adequado e o ícone de tempo adequado
        if int(self.capturarHora()[:2]) >= 5 and int(self.capturarHora()[:2]) < 13:
            corfonte = (0, 0, 0)
            fundo = "interface\\fundos\\manha.png"
            iconetempo = "interface\\botoes\\dialimpo.png"
        elif int(self.capturarHora()[:2]) >= 13 and int(self.capturarHora()[:2]) < 18:
            corfonte = (0, 0, 0)
            fundo = "interface\\fundos\\tarde.png"
            iconetempo = "interface\\botoes\\dialimpo.png"
        else:
            corfonte = (255, 255, 255)
            fundo = "interface\\fundos\\noite.png"
            iconetempo = "interface\\botoes\\noitelimpa.png"

        chuva = "interface\\botoes\\chuva.png"

        try:
            urlopen("http://www.google.com")
            conexao = "interface\\botoes\\conectado.png"
        except:
            conexao = "interface\\botoes\\desconectado.png"

        if len(conta.listalembretes) == 0:
            iconelembretes = "interface\\botoes\\iconesemlembretes.png"
        else:
            iconelembretes = "interface\\botoes\\iconelembretes.png"

        desligar = "interface\\botoes\\desligar.png"
        enviaremail = "interface\\botoes\\enviaremail.png"
        iconetransito = "interface\\botoes\\iconetransito.png"
        logoff = "interface\\botoes\\logoff.png"
        operlembretes = "interface\\botoes\\operlembretes.png"
        sobre = "interface\\botoes\\sobre.png"
        visualizartransito = "interface\\botoes\\visualizartransito.png"

        black = (255,255,255)
        self.screen = pg.display.set_mode((415, 640))
        pg.display.set_caption("PyMemo - Usuário logado")

        font = pg.font.SysFont("arial", 30)

        while True:

            if self.entrouwhile == False:
                self.pais, self.temperatura, self.tempo = self.atualizarTemperatura(conta)
                self.entrouwhile = True
            else:
                if self.capturarHora()[3:] == "00" or self.capturarHora()[3:] == "30":
                    self.pais, self.temperatura, self.tempo = self.atualizarTemperatura(conta)

            # se tiver chovendo, muda-se o ícone de tempo
            if "rain" in self.tempo:
                iconetempo = iconetempo = "interface\\botoes\\chuva.png"

            pg.event.pump()
            keyinput = pg.key.get_pressed()
            pos = (20, 20)
            self.screen.fill(black)

            # blit do fundo
            self.screen.blit(pg.image.load(fundo).convert(), pg.image.load(fundo).convert().get_rect())

            # blit ícone tempo, temperatura, cidade, hora
            self.screen.blit(pg.image.load(iconetempo).convert(), pg.draw.circle(self.screen, (0,0,0), (40, 40), 10))
            self.screen.blit(pg.font.SysFont("tahoma", 48).render(self.temperatura + chr(186), True, corfonte), (100, 20))
            self.screen.blit(pg.font.SysFont("tahoma", 20).render(conta.getCidade() + ", " + self.pais, True, corfonte), (100, 75))
            self.screen.blit(pg.font.SysFont("tahoma", 65).render(self.capturarHora(), True, corfonte), (230, 7))

            # blit boas vindas, data
            self.screen.blit(font.render(self.capturarData()[3] + ", " + self.capturarData()[0] + " de " + self.capturarData()[1] + " de " + self.capturarData()[2], True, corfonte), (20, 130))
            self.screen.blit(font.render(self.capturarSaudacao() + ", " + conta.getUsuario().split(" ")[0] + "!", True, corfonte), (90, 170))

            # blit operadores de lembretes e visualizar trânsito
            self.screen.blit(pg.image.load(iconelembretes).convert(), pg.draw.circle(self.screen, (0,0,0), (40, 240), 10))
            self.screen.blit(pg.image.load(operlembretes).convert(), pg.draw.circle(self.screen, (0,0,0), (35, 300), 10))
            self.screen.blit(pg.image.load(visualizartransito).convert(), pg.draw.circle(self.screen, (0,0,0), (35, 500), 10))


            # blit conexão, email, sobre, logoff, desligar
            self.screen.blit(pg.image.load(conexao).convert(), pg.draw.circle(self.screen, (0,0,0), (40, 608), 10))
            self.screen.blit(pg.image.load(enviaremail).convert(), pg.draw.circle(self.screen, (0,0,0), (100, 610), 10))
            self.screen.blit(pg.image.load(sobre).convert(), pg.draw.circle(self.screen, (0,0,0), (165, 610), 10))
            self.screen.blit(pg.image.load(logoff).convert(), pg.draw.circle(self.screen, (0,0,0), (300, 590), 10))
            self.screen.blit(pg.image.load(desligar).convert(), pg.draw.circle(self.screen, (0,0,0), (360, 585), 10))

##            self.screen.blit(font.render("Selecione sua conta...", True, corfonte), (90, 50))

            # blit dos lembretes do usuário
            posy = 230
            for lembrete in conta.listalembretes:
                # se estamos o lembrete é de hoje... imprimir e avançar o ponteiro de posição posy
                if lembrete.getData() == (self.capturarData()[0] + str(datetime.now())[5:7]):
                    # se passou da hora de realizar a atividade do lembrete... (cor da fonte do lembrete será cinza)
                    if int(lembrete.getHora()[:2] + lembrete.getHora()[3:]) < int(self.capturarHora()[:2] + self.capturarHora()[3:]):
                        self.screen.blit(pg.font.SysFont("arial", 16).render(lembrete.getHora() + " " + unicode(lembrete.getTexto()), True, (128, 128, 128)), (80, posy))
                    else:
                        self.screen.blit(pg.font.SysFont("arial", 16).render(lembrete.getHora() + " " + unicode(lembrete.getTexto()), True, corfonte), (80, posy))
                    posy = posy + 20


            for event in pg.event.get():
                if event.type == QUIT:
                    exit()

                if event.type == MOUSEBUTTONDOWN:
                    x, y = pg.mouse.get_pos()

                    # 20 + 10 = 30, 600 + 10 = 620, logo a tupla de posição da imagem era (30, 610) acima
                    if (x in range(25, 65)) and (y in range(290, 330)):
                        print "\n\n** Adicionar lembrete **\n\n"
                        return "adicionarlembrete"

                    elif (x in range(25, 65)) and (y in range(331, 370)):
                        print "\n\n** Excluir lembrete **\n\n"
                        return "excluirlembrete"

                    elif (x in range(25, 65)) and (y in range(371, 410)):
                        print "\n\n** Editar lembrete **\n\n"
                        return "editarlembrete"

                    elif (x in range(25, 65)) and (y in range(411, 450)):
                        print "\n\n** Visualizar todos os lembretes **\n\n"
                        return "visualizartodoslembretes"

                    elif (x in range(25, 65)) and (y in range(490, 530)):
                        print "\n\n** Visualizar trânsito **\n\n"
                        self.screen.blit(font.render(u"Capturando informações...", True, corfonte), (70, 500))
                        pg.display.flip()
                        return "visualizartransito"

                    elif (x in range(90, 120)) and (y in range(600, 625)):
                        print "\n\n** Enviar e-mail **\n\n"
                        self.screen.blit(font.render("Enviando e-mail...", True, corfonte), (70, 500))
                        pg.display.flip()
                        return "enviaremail"

                    elif (x in range(155, 255)) and (y in range(600, 625)):
                        print "\n\n** Sobre **\n\n"
                        return "sobre"

                    elif (x in range(290, 335)) and (y in range(580, 625)):
                        print "\n\n** Logoff **\n\n"
                        return "logoff"

                    elif (x in range(350, 395)) and (y in range(575, 625)):
                        print "\n\n** Desligar **\n\n"
                        exit()


                elif event.type == MOUSEMOTION:
                    x, y = pg.mouse.get_pos()

                    print x, y

            #update em toda a tela, semelhante ao display.update (display.update
            #nem sempre dá update em toda a tela)
            pg.display.flip()


def main():
##    interfacepygame = InterfacePygame()
##    interfacepygame.janelaContas()
    pass

if __name__ == '__main__':
    main()
